#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <iomanip>
#include <fstream>
#include <cstring>
using namespace std;
int GenerateTestingInputFiles( //返回值为生成文本文件的数量,更具filenames中的列表打开每个文件，逐个写入随机文章.
int filenum,//文件数
int wordnum,//每行最少单词数量
int charnum,//每单词最小字符数
int consecutive_ws, //连续单词分隔符
int ws_type,//单词分隔符类型，1 2 3分别表示space tab both
int linefeed, //行的数量
vector<string> *filenames //生成的若干文本文件的文件名，建议用“配置编号＋数字”命名即可，假设第5号配置有2个文件,则可分别命名为5_1.txt 5_2.txt
);
string generate_param(int id) { //产生一条数据

    string r="";
    int filenum;//文件数
    int wordnum;//每行最少单词数量
    int charnum;//每单词最小字符数
    int consecutive_ws; //连续单词分隔符
    int ws_type;//单词分隔符类型，1 2 3分别表示space tab both
    int linefeed; //行的数量

    filenum=rand()%5+10;
    wordnum=rand()%5+3;
    charnum=2;
    consecutive_ws='-';
    ws_type=1;
    linefeed=rand()%10+5;

    char p[20];
    sprintf(p,"%d %d %d %c %d %d %d\n",filenum,wordnum,charnum,consecutive_ws,ws_type,linefeed,id);//id为第几号配置，文件名用  配置_1,2,3,4,.txt来生成
    r=p;
    return r;
}
const char* getRandomChar(){//获得一个随机的char
    string p="a";
    p[0]=rand()%('z'-'a')+'a';
    return p.c_str();
}
const string generate_word(int charnum){
    //生成最小字符数的单词，默认范围为charnum到6个字母
    int i=rand()%(6-charnum)+charnum;
    string p="";
    for(int j=0;j<i;j++){
        p.insert(0,getRandomChar());
    }
    return p;

}
const string generate_artic_random(int wordnum,int charnum,int consecutive_ws,int ws_type,int linefeed){ //根据参数生成随机文章并且返回string 对象的函数
    string text="";
    int line_wordnum;//每行的单词数,最大10个
    for(int i=0;i<linefeed;i++){//处理行
        line_wordnum=rand()%(10-wordnum)+wordnum;//随机决定每行多少个单词
        for(int j=0;j<line_wordnum;j++){
            text+=generate_word(charnum);//随机添加单词
            text+=ws_type==1?" ":"  ";//单词分隔符类型：1空格2/3用tab
        }
        text+="\n";//回车
    }
    return text;
}
int main( )
{
    int i;
    vector<string> *filename;
    srand( (unsigned)time( NULL ) );
    FILE *fp=fopen("test_data.txt","w+");
    fp!=NULL?puts("done"):puts("fall");
    
    for(int i = 0; i < 100;i++ )
    {
        fputs(generate_param(i).c_str(),fp);
    }
    fclose(fp);//写入100条文章随机生成信息完毕，开始读取


    //任务3，4的安排
    //1。读取test_data的内容:

    //生成ifstream的对象并打开文件
    ifstream input("test_data.txt", ios::in); // | ios::binary);
    char buffer[100];
    string bString;
    //读取失败
    if(input.fail() )
    {
        cout << "can not open the file"<<endl;
        exit(1);
    }
    //依次读取sizeof(buffer)长度的数据，并输出
    do{
        //如果读取成功，则输出内容
        if(input.good() )
        {
            int filenum;//文件数
            int wordnum;//每行最少单词数量
            int charnum;//每单词最小字符数
            int consecutive_ws; //连续单词分隔符
            int ws_type;//单词分隔符类型，1 2 3分别表示space tab both
            int linefeed; //行的数量
            int file_id;//文件组的id，用于批量生成文件
            //vector<string> filenames;
            input.getline(buffer, sizeof(buffer));
            bString=buffer;
            char *tp=strtok(buffer," ");
            int i=0;;
            while(tp){//分割参数
                switch(i){
                    case 0:filenum=std::atoi(tp);break;//文件数
                    case 1:wordnum=std::atoi(tp);break;//最短单词数
                    case 2:charnum=std::atoi(tp);break;//最短字符
                    case 3:consecutive_ws=std::atoi(tp);break;//连接符
                    case 4:ws_type=std::atoi(tp);break;//分隔符
                    case 5:linefeed=std::atoi(tp);break;//行数
                    case 6:file_id=std::atoi(tp);break;//文件组id
                }
                i++;
                tp=strtok(NULL," ");
            }
            //cout<<filenum<<"-";
            //cout<<endl;
            /*读取完毕，开始写入随机文本
                函数要求：生成随即单词，给出每单词最小字符数

            */
           //利用id和filenum生成文件的vector<string>，然后传入
           filename=new vector<string>();//建立文件序列 储存结构
           char *strPath=new char[20];
           string param="";//用于命令行的参数列表
           for(i=0;i<filenum;i++){
                //提前生成好测试txt存放进入filename中
                //cout<<i<<endl;
                sprintf(strPath,"artical/%d_%d.txt",file_id,i);
                //cout<<strPath<<"++++"<<endl;
                filename->push_back(strPath);
                param+= strPath; //增加参数
                param+= " ";
           }
           //执行一行的参数所对应的文章的生成,即：生成filenum个随机文件，并且返回生成的数量：其实就是filenum。filename指针中储存了具体的文件名的名字
           GenerateTestingInputFiles(filenum,wordnum,charnum,consecutive_ws,ws_type,linefeed,filename);

           
           //测试文件写入完毕，准备调用count进行测试
           //count的参数列表是文件名，即filename中的内容线性组合
            cout<<"Param List:"<<param<<endl;
            //对一条参数列表，应用于conut1-7
            stringstream *ss=new stringstream;
            for(int i=1;i<=7;i++){
                (*ss)<<"count"<<i<<".exe "<<param;
                system(ss->str().c_str());
                ss->clear();
                ss->str("");
            }
           //清除指针
           delete filename,strPath,ss;
           
           
        }
    }while(!input.eof() );

    //关闭输入流
    system("pause");
    input.close();
    return 0;
}
int GenerateTestingInputFiles( //返回值为生成文本文件的数量,更具filenames中的列表打开每个文件，逐个写入随机文章.
int filenum,//文件数
int wordnum,//每行最少单词数量
int charnum,//每单词最小字符数
int consecutive_ws, //连续单词分隔符
int ws_type,//单词分隔符类型，1 2 3分别表示space tab both
int linefeed, //行的数量
vector<string> *filenames //生成的若干文本文件的文件名，建议用“配置编号＋数字”命名即可，假设第5号配置有2个文件,则可分别命名为5_1.txt 5_2.txt
){
    //从filenames中接受文件名，并且利用generate_artic_random函数生成随机文章写入当前目录下的artical文件夹中
    //cout<<"file count:"<<filenum<<endl;
    for(int i=0;i<filenum;i++){
        string *path=new string((*filenames)[i]); //将路径和filenames中的参数结合
        //cout<<*path<<endl;
        FILE *fp=fopen(path->c_str(),"w+");//打开文件写入
        fp!=NULL?cout<<"done"<<endl:cout<<"err"<<endl;
        fputs(generate_artic_random(wordnum,charnum,consecutive_ws,ws_type,linefeed).c_str(),fp);//将随机文章写入该文件
        fclose(fp);//关闭此文件
        delete path,fp;//删除指针
    }
    return filenum;
}